
Contra - Mountain Special
ASM Notes

--------

Eagle Item ends the level and stops the Timer

1E30D: 20 E5E9	JSR $E9E5
**
1E30D: 20 50F6	JSR $F650

--

1F650: 20 E5E9	JSR $E9E5	; Normal Eagle Routine
1F653: 20 DBA8	JSR $A8DB	; End of Level Routine of the Carrier (Bank 0)

1F656: A9 01	LDA #$01	; A = 01
1F658: 20 6BC1	JSR $C16B	; Play Sound (stop music)

1F65B: A9 1F	LDA #$1F	; A = 1F
1F65D: 20 6BC1	JSR $C16B	; Play Sound (Weapon Item sound)

1F660: A9 00	LDA #$00	; A = 00
1F662: 8D C701	STA $01C7	; Stop Timer

1F665: 60	RTS

--

28DB: 20 EAEA	JSR $EAEA	; Play Sound A and Set Delay to FF
28DE: A9 30	LDA #$30	; A = 30

Replace with:

28DE: A9 90	LDA #$90	; Longer delay (144 decimal = 2.4 seconds)

--

1E310: A9 20	LDA #$20	; A = 20
1E312: 85 7D	STA $7D		; Eagle Weapon Flash Timer

Replace with:

1E310: A9 60	LDA #$60	; Longer Flash

----

Set the scores to 0
Set Game Mode to 0 after the credits (instead of having the status screen)

13B90: 85 30	STA $30		; Current Level
13B92: C6 18	DEC $18

Replace with:

13B90: 20 D0BF	JSR $BFD0
13B93: EA	NOP

--

13FD0: 8D E207	STA $07E2
13FD3: 8D E307	STA $07E3
13FD6: 8D E407	STA $07E4
13FD9: 8D E507	STA $07E5
13FDC: A9 00	LDA #$00	; A = 00
13FDE: 85 18	STA $18		; set Game Mode to 0 (Intro Screen)

13FF0: 60	RTS

----

Make the Eagle Weapon Item immobile

0041: B9 5C80	LDA $805C,Y
0044: 9D F804	STA $04F8,X	; Enemy Y Velocity (low byte)
0047: B9 5D80	LDA $805D,Y
004A: 9D E804	STA $04E8,X	; Enemy Y Velocity (high byte)
004D: B9 5E80	LDA $805E,Y
0050: 9D 1805	STA $0518,X	; Enemy X Velocity (low byte)
0053: B9 5F80	LDA $805F,Y
0056: 9D 0805	STA $0508,X	; Enemy X Velocity (high byte)

0059: 4C 8EE7	JMP $E78E	; Advance to Next Routine

**

0059: 4C 80BD	JMP $BD80

--

3D80: BD A805	LDA $05A8,X	; Enemy Attributes
3D83: 29 07	AND #$07	; keep bits ... .xxx (Weapon Code)
3D85: C9 06	CMP #$06	; 06 = Eagle Item
3D87: D0 0E	BNE $3D97

3D89: A9 00	LDA #$00	; A = 00
3D8B: 9D F804	STA $04F8,X	; Enemy Y Velocity (low byte)
3D8E: 9D E804	STA $04E8,X	; Enemy Y Velocity (high byte)
3D91: 9D 1805	STA $0518,X	; Enemy X Velocity (low byte)
3D94: 9D 0805	STA $0508,X	; Enemy X Velocity (high byte)

3D97: 4C 8EE7	JMP $E78E	; Advance to Next Routine

----

Prevent the game from becoming harder after beating it

1CF58: E6 31	INC $31		; Number of times the game was completed
**
1CF58: EA	NOP
1CF59: EA	NOP

----

Prevent the player from getting a Game Over

1DA01: F0 03	BEQ $1DA06
1DA03: D6 32	DEC $32,X	; Player Lives

Cancel with 4 NOPs

Eventually, make the game keep track of the number of deaths

----

Pre-level screen

1CAAF: 20 17C2	JSR $C217	; Draw Text String A

1B2F8 to 1B332
1B356 to 1B3B3

Must be changed to everything replacing REST
In case a Game Over screen becomes possible

19B3 -> 1B319	1P (1B276)
1B356 -> 56B3	YOUR OBJECTIVE
20 88 59 4F 55 52 00 4F 42 4A 45 43 54 49 56 45
FE

F8B2 -> 1B2F8	REST (1B270)
67B3 -> 1B36C	GRAB THE TROPHY AT
21 26 47 52 41 42 00 54 48 45 00 54 52 4F 50 48
59 00 41 54 FE

0CB3 -> 1B30C	HI (1B274)
7CB3 -> 1B37C	THE TOP OF THE MOUNTAIN
21 64 54 48 45 00 54 4F 50 00 4F 46 00 54 48 45
00 4D 4F 55 4E 54 41 49 4E FE

94B2 -> 1B294	STAGE (1B27A)
96B3 -> 1B396	AS FAST AS POSSIBLE
22 A6 41 53 20 46 41 53 54 20 41 53 00 50 4F 53
53 49 42 4C 45 FE

Level name: 1B28C

Avoid the level number to be drawn
1CAB7: 9D FE06	STA $06FE,X
Cancel with 3 NOPs (EA)

Avoid the hi score to be drawn
1CAD0: 20 F8CA	JSR $CAF8
Cancel with 3 NOPs

Avoid the score to be drawn
1CAE2: 20 F8CA	JSR $CAF8
Cancel with 3 NOPs

Avoid the lives to be drawn
1CA9A: 99 FE06	STA $06FE,Y
Cancel with 3 NOPs

----

Pre-level delay

1CE95: A9 C0	LDA #$C0	; A = C0 (delay for score display screen)
Replace with:
1CE95: A9 E0	LDA #$E0	; A = E0 (longer delay)

----

Set the timer to 0

1CE82: 20 ADCA	JSR $CAAD	; Draw "STAGE" string
**
1CE82: 20 00F8	JSR $F800

--

1F800: 20 ADCA	JSR $CAAD	; Draw "STAGE" string

1F800: A2 00	LDX #$00	; X = 00
1F667: A9 06	LDA #$06	; A = 06
1F669: 9D BE01	STA $01BE,X
1F66C: A9 0D	LDA #$0D	; A = 0D
1F66E: 9D BF01	STA $01BF,X

1F800: A2 06	LDX #$06	; X = 06
1F80E: A9 00	LDA #$00	; A = 00

1F810: 9D C001	STA $01C0,X
1F000: CA	DEX
1F000: 10 FA	BPL $1F810

1F000: E8	INX

1F000: A9 4D	LDA #$4D	; A = 4D
1F000: 9D C201	STA $01C2,X
1F000: A9 53	LDA #$53	; A = 53
1F000: 9D C501	STA $01C5,X
1F000: A9 00	LDA #$00	; A = 00
1F000: 9D C601	STA $01C6,X
1F000: 9D C701	STA $01C7,X	; Timer Flag (1 = Active)

1000: 60	RTS

----

Start Timer when the level's song starts

1CEB8: B9 C9CE	LDA $CEC9,Y
1CEBB: 20 6BC1	JSR $C16B	; Play Sound (music in this case)
**
1CEBB: 20 80F6	JSR $F680

--

1F680: 20 6BC1	JSR $C16B	; Play Sound

1F683: A9 01	LDA #$01	; A = 01
1F685: 8D C701	STA $01C7	; Timer Flag (1 = Active)

1F687: 60	RTS

----

Timer Tick

1C0AB: A9 00	LDA #$00	; A = 00
1C0AD: 85 1B	STA $1B

Replace with:

1C0AB: 20 50F8	JSR $F850
1C0AE: EA	NOP

--

Timer units (minutes and seconds) are formatted for display
This means 00 -> Tile Code 30

1F850: A5 18	LDA $18
1F852: C9 05	CMP #$05
1F854: D0 44	BNE $F89E

1F856: AD C701	LDA $01C7	; Timer Flag (1 = Active)
1F859: F0 3F	BEQ $return

1F85B: EE C601	INC $01C6	; 1/60 second
1F85E: AD C601	LDA $01C6
1F861: C9 3C	CMP #$3C
1F863: 90 35	BCC $return

1F865: A9 00	LDA #$00	; A = 00
1F867: 8D C601	STA $01C6	; reset 1/60 second

1F86A: EE C401	INC $01C4	; second units
1F86D: AD C401	LDA $01C4
1F870: C9 3A	CMP #$3A
1F872: 90 26	BCC $return

1F874: A9 30	LDA #$30	; A = 30
1F876: 8D C401	STA $01C4	; reset second units

1F900: EE C301	INC $01C3	; second tens
1F900: AD C301	LDA $01C3
1F903: C9 36	CMP #$36
1F905: 90 17	BCC $return

1F907: A9 30	LDA #$30	; A = 30
1F909: 8D C301	STA $01C3	; reset second tens

1F900: EE C101	INC $01C1	; minute units
1F900: AD C101	LDA $01C1
1F903: C9 3A	CMP #$3A
1F905: 90 08	BCC $return

1F907: A9 30	LDA #$30	; A = 30
1F909: 8D C101	STA $01C1	; reset minute units

1F900: EE C001	INC $01C0	; minute tens

1C0AB: A9 00	LDA #$00	; A = 00
1C0AD: 85 1B	STA $1B

1F89E: 60	RTS

----

Rifle Man - Random number of bullets per attack (2,3,4,5)

09C2: B9 CF89	LDA $89CF,Y
And
0A89: B9 CF89	LDA $89CF,Y

Replace with:
09C2: 20 B0BD	JSR $BDB0

--

3DB0: A5 34	LDA $34		; Randomizer
3DB2: 29 03	AND #$03	; keep bits .... ..xx (0-3)
3DB4: 18	CLC
3DB5: 69 02	ADC #$02

3DB7: 60	RTS

----

Level Header

00 01 BF 82 98 96 68 9D 13 20 F0 F0 62 63 62 63
3D 3E 04 62 00 01 22 07 13 01 00 00 00 00 00 00

----

Palettes

3D: 20 10 1C		20 10 11
3E: 20 10 0A		20 0B 08
04: 16 30 10		
62: 20 22 02		

00: 37 12 0F		37 0A 0F
01: 36 16 0F		36 06 0F
22: 20 26 16		20 26 06 (not definitive)
07: 20 00 0F		

Ending Palettes

67 68 69 68		Water cycles

25: 30 10 00
65: 18 07 1A		18 07 31	Green part of mountain
66: 16 18 07
67: 20 10 11		Water border cycle
6D: 0B 1B 3B		08 18 38	Helicopter
6C: 16 00 00
22: 20 26 16
64: 20 10 00		20 31 21	Mountain peaks

----

// End of Document //

--------
